#include <stdio.h>
#include <stdlib.h>

#define	LIST_INIT_SIZE     80
// 线性表存储空间的初始分配量
#define	LISTINCREMENT    10
// 线性表存储空间的分配增量
#define OK 1
#define FALSE 0
#define OVERFLOW 0
#define ERROR 0
typedef	int ElemType;
typedef int Status;

typedef struct  LNode 
{
    ElemType      data;  // 数据域
    struct LNode   *next;  // 指针域
} LNode, *LinkList;  

LinkList  L；  // L 为单链表的头指针

/*
	GetElem(L, i, &e)    // 取第i个数据元素
	ListInsert(&L, i, e)    // 插入数据元素
	ListDelete(&L, i, &e)    // 删除数据元素
	ClearList(&L)      // 重置线性表为空表
	CreateList(&L, n) 	// 生成含 n 个数据元素的链表
*/
 Status GetElem (LinkList L, int i, ElemType *e) 
 {
   // L是带头结点的链表的头指针，以 e 返回第 i 个元素
 	p = L->next;   j = 1;  // p指向第一个结点，j为计数器
 	while (p && j<i)  
 	{
 		p = p->next;  
 		++j; 
 	}
        // 沿指针向后查找，直到 p 指向第 i 个元素或 p 为空
 	if ( !p || j>i )
    return ERROR;      //  第 i 个元素不存在
	*e = p->data;                 //  取得第 i 个元素
	return OK;
} // GetElem

Status ListInsert(LinkList L, int i, ElemType e) 
{
    // L 为带头结点的单链表的头指针，本算法
    // 在链表中第i 个结点之前插入新的元素 e
	p = L;    
	j = 0;
	while (p && j < i-1) 
    { 
    	p = p->next;
    	++j;
    }   // 寻找第 i-1 个结点
	if (!p || j > i-1)
		return ERROR;      // i 大于表长或者小于1 
	s = (LNode*)malloc(sizeof(LNode)); //生成新结点
	s->data = e;
	s->next = p->next;
	p->next = s;  // 插入
	return OK;
	/*双向链表的插入操作*/
	/*
	s->next = p->next;    p->next = s;
	s->next->prior = s;    s->prior = p;
	*/
} // LinstInsert

 Status ListDelete (LinkList L, int i, ElemType *e) 
{
   // 删除以 L 为头指针(带头结点)的单链表中第 i 个结点
	p = L;    j = 0;
	while (p->next && j < i-1)	// 寻找第 i 个结点，并令 p 指向其前趋
	{
		p = p->next;   
		++j; 
	} 
	if  (!(p->next) || j > i-1) 
   		return ERROR;  // 删除位置不合理
   	q = p->next;  p->next = q->next;     // 删除结点
	*e = q->data;   
	free(q);         //释放结点
	return OK;
	/* 双向链表的删除操作*/
	/*
	p->prior->next = p->next;
	p->next->prior = p->prior;
	free(p);
	*/
} // ListDelete

void ClearList(LinkList L) // 将单链表重新置为一个空表
{
    while (L->next) 
    {
        p=L->next;
        L->next=p->next;
    }
} // ClearList

void CreateList (LinkList L, int n) // 逆序输入 n 个数据元素，建立带头结点的单链表
{
	L = (LinkList) malloc (sizeof (LNode));
	L->next = NULL; // 先建立一个带头结点的单链表
	for (i = n; i > 0; --i) 
	{
    	p = (LinkList) malloc (sizeof (LNode));
    	scanf(&p->data);    // 输入元素值
    	p->next = L->next; L->next = p;  // 插入
	}
} // CreateList

int main()
{
    SqList *L=NULL;
    int maxsize;
    maxsize=5;
    InitList_Sq(&L, maxsize);
    return 0;
}